[Dúvidas] Arquivos em Disco em C

1. [Dúvidas] Arquivos em Disco em C

Paulo
d3j4_Vu

(usa Ubuntu)

Enviado em 22/03/2008 - 17:37h

Fiz um cadastro de livros usando um tutorial da vol sobre arquivos em disco. Mas estou com problemas pra implementar uma função que "apague" um registro do arquivo.

A função recebe uma string(nome do livro), dae tenho que procurar o nome do livro e se achar, deletar na seguinte ordem:

deletar linha 1 - nome do livro encontrado
deletar linha 2 - genero do livro encontrado
deletar linha 3 - autor do livro encontrado

Mas não to conseguindo fazer...alguém pode me ajudar?
E tenho uma dúvida: a função fscanf qdo trabalha com um while e EOF, como no exemplo abaixo, sozinha com o loop ela passa de linha cada vez que é chamada? Ex:

while ( (fscanf(estrutura," %s",Temporaria)) != EOF )

========

O código do cadastro de livro:

=============================

#include <stdio.h>

#define TAM 30

// Função que insere registros no arquivo

void inserir_dados(char FNome[TAM],
char FGenero[TAM],
char FAutor[TAM])
{
// cria um arquivo de ponteiro
FILE *estrutura;

// abre o arquivo para inserção
// se não houver arquivo cria-se, senão é inserido ao final do arquivo
// um novo registro
estrutura = fopen("banco.txt","a");

// grava no arquivo nome do livro e pula uma linha
fprintf(estrutura,"%s\n",FNome);
// grava no arquivo o genero do livro e pula uma linha
fprintf(estrutura,"%s\n",FGenero);
// grava no arquivo o autor do livro e pula uma linha
fprintf(estrutura,"%s\n",FAutor);

// escreve na na tela o que foi inserido
fprintf(stdout,"\n Livro: %s"
"\n Genero: %s"
"\n Autor: %s"
"\n Cadastro inserido corretamente\n",FNome,FGenero,FAutor);

// aguarda uma tecla
getchar();
getchar();
system("cls");

// fecha o arquivo
fclose(estrutura);
}

void pesquisar_livro( char FNomePesquisa[TAM] )
{
// cria um ponteiro de arquivo
FILE *estrutura;

// ponteiro para guardar uma string lida do arquivo
char Temporaria[TAM];

// variaveis correspondentes a campos do cadastro de um livro
char FGenero[TAM], // armazena genero do arquivo a ser lido
FAutor[TAM]; // armazena autor do arquivo a ser lido

// variavel que serve pra chegar se achou registro ou não
int Leu = 0;

// abre o arquivo para leitura
estrutura = fopen("banco.txt","r");

// pega a linha atual e analisa se é final de arquivo
// se não for final de arquivo, compara com a string passada para pesquisa
while ( (fscanf(estrutura," %s",Temporaria)) != EOF )
{
// se a linha do nome do livro atual for igual à da pesquisa
if (!strcmp(Temporaria,FNomePesquisa))
{
// imprime nome que esta na primeira linha lida do arquivo
fprintf(stdout,"Nome: %s",Temporaria);
// pula uma linha no arquivo e armazena o genero do livro
fscanf(estrutura,"\n%s",FGenero);
// imprime o genero do livro atual
fprintf(stdout,"\nGenero: %s",FGenero);
// pula uma linha no arquivo e armazena o autor do livro
fscanf(estrutura,"\n%s",FAutor);
// imprime o autor do livro atual
fprintf(stdout,"\nAutor: %s\n",FAutor);
// pula uma linha para ir para o próxima registro
fscanf(estrutura,"\n");

// 1 = Indica que foi encontrado livro
// 0 = Indica que não foi encontrado livro
Leu = 1;
}
// se não encontrar no registro atual,
else
{

// pula uma linha
fscanf(estrutura,"\n");
}
}

// checa se encontrou registro
// se não encontrou, mostra mensagem
if ( Leu == 0 )
{
printf("\n Registro nao encontrado.");
}

// aguarda pressionar uma tecla
getchar();
getchar();
system("cls");

// fecha o arquiivo
fclose(estrutura);


}

void apagar_livro( char FLivro[TAM] )
{
FILE *estrutura;
estrutura = fopen("banco.txt","a");
char Temporaria[TAM];
char *Vazio = " ";
int Deletou = 0;
long teste;

while ( (fscanf(estrutura," %s",Temporaria)) != EOF )
{
if (!strcmp(Temporaria,FLivro))
{
fprintf(estrutura,"%s",Vazio); // apaga nome
fprintf(estrutura,"%s",Vazio); // apaga genero
fprintf(estrutura,"%s",Vazio); // apaga autor
printf("\n Livro apagado com sucesso");
system("pause>nul");
Deletou = 1;
}
else
fscanf(estrutura,"\n");
}
if ( Deletou == 0 )
{
printf("\n Livro \" %s \" nao foi deletado",FLivro);
system("pause>nul");
}

system("cls");
fclose(estrutura);
}


int main()
{

// variaveis do main
char Nome[TAM],
Genero[TAM],
Autor[TAM];
int Opcao;

do{
// menu principal
printf("\n Cadastro de Livros vers. 1.0");
printf("\n 1 - Cadastra Livro");
printf("\n 2 - Pesquisar Livro");
printf("\n 3 - Apagar registro");
printf("\n 4 - Sair");
printf("\n Opcao: ");
scanf(" %d",&Opcao);

switch ( Opcao )
{
case 1: // Cadastrar nome
{
printf("\n Entre com o nome do livro: ");
scanf(" %s",Nome);
printf("\n Entre com o genero do livro: ");
scanf(" %s",Genero);
printf("\n Entre com o autor do livro: ");
scanf(" %s",Autor);

// chama função para cadastrar os livros
inserir_dados (Nome,Genero,Autor);
} break;
case 2:
{
printf("\n Qual o nome do livro que deseja pesquisar? ");
printf("\n Pesquisar: ");
scanf(" %s",Nome);
// chama função pesquisar passando o nome do livro como argumento
pesquisar_livro(Nome);
} break;
case 3:
{
printf("\n Digite o nome do livro a ser deletado do arquivo");
printf("\n Deletar: ");
scanf(" %s",Nome);
apagar_livro(Nome);
} break;
case 4:
{
printf("\n Encerrando o programa...");
system("pause>nul");
exit(1);
} break;
default:
{
printf("\n Entrou com opcao invalida");
system("pause>nul");
system("cls");
}

} } while ( (Opcao != 1) || (Opcao != 2) || (Opcao != 3) || (Opcao != 4) );

return 0;
}

=================


  


2. Re: [Dúvidas] Arquivos em Disco em C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 25/03/2008 - 15:35h

cara, não me leva a mal, mais o jeito q você tah fazeno num tah errado, mais num é o mais certo...

se você fizer com estruturas, é mais facil de armazenar, organizar, pesquisar e apagar. tem alguns exeplos aqui o VOL sobre isso...

vo olha uns links e vo posta aqui...

abraço


3. Re: [Dúvidas] Arquivos em Disco em C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 25/03/2008 - 15:42h

Listas duplamente encadeadas:
http://www.vivaolinux.com.br/scripts/verScript.php?codigo=1890

Esse script é meu, mais não tem como salvar em aquivo

Lista Vetorial
http://www.vivaolinux.com.br/scripts/verScript.php?codigo=930

Esse aquivo mostra como fazer para criar uma lista e armazenar os dados em arquivo.

você pode conciliar os 2 scripts pra fazer uma lista encadeada que salve em aquivo... qualquer duvida me manda um email

enzo@veloxmail.com.br

Abraço


4. Re: [Dúvidas] Arquivos em Disco em C

Paulo
d3j4_Vu

(usa Ubuntu)

Enviado em 25/03/2008 - 23:00h

Opa..

Eu usei estruturas num projeto quase igual a esse porém usando mysql mas infelizmente sem uma implementação mais avançada não é possível passar dados de variaveis estruturas pro banco de dados mysql, então fui para os arquivos. Acabei não usando estruturas nesse mas vlw a dica.

E obrigado pelos códigos. Não tenho um conhecimento legal ainda em estruturas de dados pois comecei a aprender na faculdade a algumas semanas mas como vou aprender mesmo, nada melhor que esses códigos pra ver uma implementação.

Só uma dúvida...no caso de estruturas de dados o limite do "banco de dados" seria a memória do computador e o tamanho das estruturas de dados seriam alocados e desalocados conforme novos dados entrem ou saiam no programa..é isso que acontece em um dos códigos certo?

Muito obrigado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts